home *** CD-ROM | disk | FTP | other *** search
/ The Arsenal Files 4 / The Arsenal Files 4 (Arsenal Computer).ISO / casm / au116-as.exe / IBMDOS / ENV.CPP next >
C/C++ Source or Header  |  1994-04-03  |  4KB  |  191 lines

  1. #include "..\au.hpp"
  2.  
  3. /*****************************************************************************/
  4. static void *mem_search(char *string, unsigned int *seg, unsigned int *off,
  5.                         unsigned int max_seg)
  6. {
  7.     void *ptr;
  8.     int len;
  9.     register unsigned int seg2, off2;
  10.  
  11.     seg2 = *seg;
  12.     off2 = *off;
  13.  
  14.     seg2 += off2 / 16;
  15.     off2 = off2 % 16;
  16.     off2 = 0;
  17.  
  18.     len = strlen(string);
  19.  
  20.     while (seg2 < max_seg)
  21.     {
  22. //          while (off2 < 16)
  23. //          {
  24.             ptr = MK_FP(seg2, off2);
  25.             if (memcmp(ptr, string, len) == 0)
  26.             {
  27.                 *seg = seg2;
  28.                 *off = off2;
  29.                 return ptr;
  30. //              }
  31. //              off2++;
  32.         }
  33.         seg2++;
  34. //          off2 = 0;
  35.     }
  36.     return NULL;
  37. }
  38. /******************************************************************************/
  39. static char *find_envblock(char *env[], unsigned int *seg, unsigned int *off,
  40.                            unsigned int max_seg)
  41. {
  42.     char *ptr;
  43.     char *ptr2;
  44.     int i;
  45.  
  46.     for (;;)
  47.     {
  48. around:
  49.         ptr = (char *)mem_search(env[0], seg, off, max_seg);
  50.         if (ptr == NULL)
  51.             return NULL;
  52.         ptr2 = ptr + strlen(env[0]) + 1;
  53.  
  54.         i=1;
  55.         while (env[i] != NULL)
  56.         {
  57.             if (*(ptr2-1) != '\0' || strncmp(ptr2, env[i], strlen(env[i])) != 0)
  58.             {
  59.                 *seg = FP_SEG(ptr2);
  60.                 *off = FP_OFF(ptr2);
  61.                 goto around;
  62.             }
  63.             ptr2 = ptr2 + strlen(env[i]) + 1;
  64.             i++;
  65.         }
  66.         *seg = FP_SEG(ptr2);
  67.         *off = FP_OFF(ptr2);
  68.         if (*ptr2 != '\0' || *(ptr2-1) != '\0')
  69.             goto around;
  70.         return ptr;
  71.     }
  72. }
  73. /**************************************************************************/
  74. static int split_into_var_cont(char *var_cont, char *var, char *cont)
  75. {
  76.     char temp[200];
  77.     char *ptr;
  78.  
  79.     strcpy(temp, var_cont);
  80.     ptr = strchr(temp, '=');
  81.     if (ptr == NULL)
  82.         return -1;
  83.     *ptr = '\0';
  84.     strcpy(var, temp);
  85.     strupr(var);
  86.     strcpy(cont, ptr+1);
  87.     return 0;
  88. }
  89. /**************************************************************************/
  90. static int get_next_var(char *var, char *cont, char **mem_ptr)
  91. {
  92.     char temp[200];
  93.     if (**mem_ptr == '\0')
  94.         return FALSE;
  95.     strcpy(temp, *mem_ptr);
  96.     *mem_ptr += strlen(temp) + 1;
  97.     split_into_var_cont(temp, var, cont);
  98.     return TRUE;
  99. }
  100. /**************************************************************************/
  101. static void uppercase_var(char *var_cont)
  102. {
  103.     char *ptr;
  104.  
  105.     ptr = strchr(var_cont, '=');
  106.     if (ptr == NULL)
  107.         return;
  108.     *ptr = '\0';
  109.     strupr(var_cont);
  110.     *ptr = '=';
  111.     return;
  112. }
  113. /**************************************************************************/
  114. static int change_variable(char *var_cont, char *mem_ptr)
  115. {
  116.     char var[80], var2[80];
  117.     char cont[150], cont2[120];
  118.     char *mem_ptr2, *mem_save;
  119.     int diff;
  120.  
  121.     uppercase_var(var_cont);
  122.  
  123.     if (split_into_var_cont(var_cont, var, cont) < 0)
  124.         return -1;
  125.  
  126.     mem_save = mem_ptr;
  127.     while (get_next_var(var2, cont2, &mem_ptr) == TRUE)
  128.     {
  129.         if (strcmp(var, var2) == 0)
  130.         {
  131.             diff = strlen(cont) - strlen(cont2);
  132.  
  133.             mem_ptr2 = mem_ptr;
  134.             while (get_next_var(var2, cont2, &mem_ptr2) == TRUE)
  135.             {
  136.             }
  137.             if (diff > 0)
  138.                 memmove(mem_save+diff, mem_save, mem_ptr2 - mem_save+1);
  139.             else
  140.                 memmove(mem_save, mem_save-diff, mem_ptr2 - (mem_save-diff)+1);
  141.             strcpy(mem_save, var_cont);
  142.             return 0;
  143.         }
  144.         mem_save = mem_ptr;
  145.     }
  146.     /* append to the end if it isn't found */
  147.     strcpy(mem_ptr, var_cont);
  148.     mem_ptr[strlen(var_cont) + 1] = '\0';
  149.     return 0;
  150. }
  151. /**************************************************************************/
  152. int alter_env(AU *au, char *var_cont, char *env[])
  153. {
  154.     char *ptr;
  155.     char *last_ptr, *second_last_ptr;
  156.     unsigned int seg = 0;
  157.     unsigned int off = 0;
  158.  
  159.     if (env[0][0] == '\0')
  160.     {
  161.         au_printf_error(au, "Need at least one environment variable for reference");
  162.         return -1;
  163.     }
  164.     last_ptr = NULL;
  165.     second_last_ptr = NULL;
  166.     for (;;)
  167.     {
  168.         ptr = find_envblock(env, &seg, &off, FP_SEG(env));
  169.         if (ptr == NULL)
  170.             break;
  171.         second_last_ptr = last_ptr;
  172.         last_ptr = ptr;
  173.     }
  174.     if (second_last_ptr != NULL)
  175.     {
  176.         return change_variable(var_cont, second_last_ptr);
  177.     }
  178.     return -1;
  179. }
  180.  
  181. #if 0
  182. /**************************************************************************/
  183. int main(int argc, char *argv[], char *env[])
  184. {
  185.     char temp[80];
  186.     scanf("%s", temp);
  187.  
  188.     return alter_env(temp, env);
  189. }
  190. #endif
  191.